package br.com.model;

/*
 help
 http://www.devmedia.com.br/classe-arraylist-e-arquivo-texto-agenda-de-contatos-uma-abordagem-estruturada-em-java/25087
 http://javanoroeste.com.br/javanoroeste/novo/artigos/arquivos.html
 */

import br.com.interfaces.DataRead;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

import javax.sound.sampled.Line;
import javax.xml.crypto.Data;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 * 
 * @author Ronen Filho
 */

/*
 * http://blog.hallanmedeiros.com/2011/02/22/ecrever-e-ler-arquivos-com-java/
 */
public class ReaderCSV implements DataRead {

	private File file;
	private boolean columnsHeader;
	// private List<String> nameColumnsHeader;
	private String separador = ";";

	// private List<DataColumn> dataColumn;

	@Override
	public void setFile(File file) {
		// Cria o arquivo
		this.file = file;
	}

	@Override
	public void setColumnsHeader(boolean header) {
		/*
		 * Configura se o arquivo possuia primeiro linha como cabeçalho true:
		 * Sim, a primeira linha será considerada como cabeçalho false: Não, a
		 * primeira linha não será considerada como cabeçalho
		 */
		columnsHeader = header;
	}

	@Override
	public boolean isColumnsHeader() {
		/*
		 * Verifica se o arquivo possuia primeiro linha como cabeçalho true:
		 * Sim, a primeira linha será considerada como cabeçalho false: Não, a
		 * primeira linha não será considerada como cabeçalho
		 */
		return columnsHeader;
	}

	@Override
	public List<String> getColumnsName() throws IOException {
		/*
		 * Ler o nome da coluna do arquivo Deve ser verificada a configuração
		 * para isColumnHeader Retorno: Deve retornar o nome das colunas
		 */

		List<String> strings = new ArrayList<String>();

		if (isColumnsHeader()) {
			// Ler nome das colunas
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);

			String linha = br.readLine();

			// teste
			// System.out.println(linha);

			// strings.addAll(Arrays.asList(linha.split("(?<=\\G.{1})")));
			strings.addAll(Arrays.asList(linha.split(separador)));

			// teste de impressão dos valores
			/*
			 * for (String cell : strings) System.out.println(cell+" ");
			 */
			br.close();
			fr.close();
		} else {
			System.out.println("Não é possível ler o nome da coluna.");
			System.out
					.println("Verifique o parametro de leitura do nome da coluna");
		}
		return strings;
	}

	@Override
	public void setColumnsFilter(List<String> columnsNames) {
		throw new UnsupportedOperationException("Not supported yet.");
	}

	@Override
	public void setColumnsFilter(int[] columnsIndex) {
		throw new UnsupportedOperationException("Not supported yet.");
	}

	@Override
	public List<DataColumn> getColumns() throws IOException {
		// public List<String> getColumns() throws IOException {
		/*
		 * Ler o conteúdo da coluna do arquivo Deve ser verificada a
		 * configuração
		 */

		List<DataColumn> dataColumns = new ArrayList<DataColumn>();
		// List<String> dataColumns = new ArrayList<String>();

		// Ler conteúdo das colunas
		FileReader fr = new FileReader(file);
		BufferedReader br = new BufferedReader(fr);

		String linha;

		int j = 0, i = 0;
		while ((linha = br.readLine()) != null) {
			for (String valor : linha.split(separador)) {
				if (i == 0) {
					DataColumn coluna = new DataColumn();
					coluna.setHeader(valor);
					dataColumns.add(coluna);
				} else {
					dataColumns.get(j).addValue(valor);
					j++;
				}
			}
			j = 0;
			i++;
			// dataColumns.addAll(Arrays.asList(linha.split(separador)));
		}

		br.close();
		fr.close();

		return dataColumns;
	}

/*	public void lerArquivoSimplesTest() throws FileNotFoundException,
			IOException {
		FileReader fr = new FileReader(file);

		BufferedReader br = new BufferedReader(fr);

		// enquanto houver mais linhas
		while (br.ready()) {
			// lê a proxima linha
			String linha = br.readLine();

			// faz algo com a linha
			System.out.println(linha);
		}

		br.close();
		fr.close();
	}*/
}
